Some modern computer programs are adapted to execute on heterogeneous computing platforms that include a host processor and one or more other devices. These computer programs typically include a host portion that is compiled into executable program code to execute on the host processor and one or more other portions, called kernels. The kernels are compiled into executable program code and are designated to execute on devices other than the host processor. Examples of these other devices include, but are not limited to, graphics processing unit(s) (GPUs), digital signal processor(s) (DSPs), and so forth.
In some cases, the kernels are hardware accelerated. Accordingly, the kernels are compiled into circuitry that is implemented within an IC. A kernel circuit, referring to a circuit implementation of a kernel, is functionally equivalent to an executable version of the kernel. A circuit design specifying the kernel circuit, for example, may be loaded into a programmable IC thereby implementing the kernel as a kernel circuit in hardware.
The kernel portion of the design is typically coded using a high level programming language (HLL). As such, kernel developers are often software developers or have software development backgrounds. For these reasons, kernel developers usually lack the hardware design knowledge necessary to debug, improve, and/or optimize kernel circuitry generated from the HLL kernel descriptions in order to meet established design requirements.